package cn.lingyangwl.agile.infra.weixin.mp.model.entity;

import cn.lingyangwl.agile.tenant.core.DataIsolation;
import cn.lingyangwl.agile.model.BasePlusPO;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.mp.builder.kefu.NewsBuilder;

import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
import java.util.List;

/**
 * 公众号菜单表
 *
 * @author shenguangyang
 */
@Getter
@Setter
@Accessors(chain = true)
@TableName(value = "wx_mp_message", autoResultMap = true)
@DataIsolation(filterTenant = true, tableName = "wx_mp_message")
public class MpMessage extends BasePlusPO {
	/**
	 * 主键
	 */
    @TableId
	private Long id;

	/**
	 * 微信公众号的消息编号
	 */
	private Long msgId;

	/**
	 * 公众号 appId
	 */
	private String mpAppId;

	/**
	 * 公众号粉丝的编号
	 */
	private Long userId;

	/**
	 * 公众号粉丝标志
	 */
	private String openid;

	/**
	 * 消息类型
	 */
	private String type;

	/**
	 * 消息来源
	 */
	private Integer sendFrom;

	/**
	 * 消息内容
	 */
	private String content;

	/**
	 * 媒体文件 id
	 */
	private String mediaId;

	/**
	 * 媒体文件 URL
	 */
	private String mediaUrl;

	/**
	 * 语音识别后文本
	 */
	private String recognition;

	/**
	 * 语音格式
	 */
	private String format;

	/**
	 * 标题
	 */
	private String title;

	/**
	 * 描述
	 */
	private String description;

	/**
	 * 缩略图的媒体 id
	 */
	private String thumbMediaId;

	/**
	 * 缩略图的媒体 URL
	 */
	private String thumbMediaUrl;

	/**
	 * 点击图文消息跳转链接
	 */
	private String url;

	/**
	 * 地理位置维度
	 */
	private Double locationX;

	/**
	 * 地理位置经度
	 */
	private Double locationY;

	/**
	 * 地图缩放大小
	 */
	private Double scale;

	/**
	 * 详细地址
	 */
	private String label;

	/**
	 * 图文消息数组
	 *
	 * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS
	 */
	@TableField(typeHandler = ArticleTypeHandler.class)
	private List<Article> articles;

	/**
	 * 音乐链接
	 */
	private String musicUrl;

	/**
	 * 高质量音乐链接
	 */
	private String hqMusicUrl;

	/**
	 * 事件类型
	 */
	private String event;

	/**
	 * 事件 Key
	 */
	private String eventKey;

	/**
	 * 是否删除
	 */
	private Boolean deleted;

    public static LambdaQueryWrapper<MpMessage> lqw() {
		return Wrappers.lambdaQuery();
	}

	/**
	 * 文章
	 */
	@Data
	public static class Article implements Serializable {

		/**
		 * 图文消息标题
		 */
		@NotEmpty(message = "图文消息标题不能为空", groups = NewsBuilder.class)
		private String title;
		/**
		 * 图文消息描述
		 */
		@NotEmpty(message = "图文消息描述不能为空", groups = NewsBuilder.class)
		private String description;
		/**
		 * 图片链接
		 *
		 * 支持 JPG、PNG 格式，较好的效果为大图 360*200，小图 200*200
		 */
		@NotEmpty(message = "图片链接不能为空", groups = NewsBuilder.class)
		private String picUrl;
		/**
		 * 点击图文消息跳转链接
		 */
		@NotEmpty(message = "点击图文消息跳转链接不能为空", groups = NewsBuilder.class)
		private String url;

	}
    public static class ArticleTypeHandler extends AbstractJsonTypeHandler<List<Article>> {

        @Override
        protected List<Article> parse(String json) {
            return JSON.parseArray(json, Article.class);
        }

        @Override
        protected String toJson(List<Article> obj) {
            return JSON.toJSONString(obj);
        }
    }

}
